TStream spatne zapisuje string

Otázka od: Pavel Hauptman

20. 8. 2004 11:00

Zdravim vsechny,

rad bych se zeptal, jak spravne zapisovat string pomoci TStream. Pouzivam
nasledujici kod a do souboru se mi zapisuji uplne nesmyslne stringy.

    FillChar(veta1, SizeOf(veta1), #0);
    veta1.lngh := cdsPTEX.Fields[0].AsInteger;
    veta1.walo := cdsPTEX.Fields[1].AsInteger;
    veta1.tnum := cdsPTEX.Fields[2].AsInteger;
    veta1.text := cdsPTEX.Fields[3].AsString;
    // tady koukam do debuggeru a hodnota veta1.text je v poradku.
    fout.Write(veta1.lngh, 2);
    fout.Write(veta1.walo, 2);
    fout.Write(veta1.tnum, 4);
    fout.Write(veta1.text, Length(veta1.text));
    //tady koukam do debuggeru a hodnota veta1.text je opet v poradku, ale
do souboru se zapise nesmysl.

Kde delam chybu?

Diky a s pozdravem

Pavel Hauptman


Odpovedá: Ales Vasicek

20. 8. 2004 11:07

Ahoj,

Musis pouzit tuto konstrukci:

fout.Write(Pointer(veta1.text)^, Length(veta1.text));

Ales

> -----Original Message-----
> From: Pavel Hauptman [mailto:phauptman@bilbo.cz]
>
> rad bych se zeptal, jak spravne zapisovat string pomoci
> TStream. Pouzivam
> nasledujici kod a do souboru se mi zapisuji uplne nesmyslne stringy.
>
> FillChar(veta1, SizeOf(veta1), #0);
> veta1.lngh := cdsPTEX.Fields[0].AsInteger;
> veta1.walo := cdsPTEX.Fields[1].AsInteger;
> veta1.tnum := cdsPTEX.Fields[2].AsInteger;
> veta1.text := cdsPTEX.Fields[3].AsString;
> // tady koukam do debuggeru a hodnota veta1.text je v poradku.
> fout.Write(veta1.lngh, 2);
> fout.Write(veta1.walo, 2);
> fout.Write(veta1.tnum, 4);
> fout.Write(veta1.text, Length(veta1.text));


Odpovedá: Jiri Foldyna

20. 8. 2004 11:22

> rad bych se zeptal, jak spravne zapisovat string pomoci
> TStream. Pouzivam
> nasledujici kod a do souboru se mi zapisuji uplne nesmyslne stringy.
>
> FillChar(veta1, SizeOf(veta1), #0);
> veta1.lngh := cdsPTEX.Fields[0].AsInteger;
> veta1.walo := cdsPTEX.Fields[1].AsInteger;
> veta1.tnum := cdsPTEX.Fields[2].AsInteger;
> veta1.text := cdsPTEX.Fields[3].AsString;
> // tady koukam do debuggeru a hodnota veta1.text je v poradku.
> fout.Write(veta1.lngh, 2);
> fout.Write(veta1.walo, 2);
> fout.Write(veta1.tnum, 4);
> fout.Write(veta1.text, Length(veta1.text));
> //tady koukam do debuggeru a hodnota veta1.text je opet v
> poradku, ale
> do souboru se zapise nesmysl.
>
> Kde delam chybu?

Ahoj,

zapisujes do souboru pointer na string. Ja to delam takto:

Zapis:

function WriteToStream(Value : integer; fs : TFileStream) : boolean;
// write integer
begin
  Result := fs.write(Value, SizeOf(Value)) = SizeOf(Value);
end;

function WriteToStream(Value : string; fs : TFileStream) : boolean;
// write string
begin
  Result := WriteToStream(Length(Value), fs);
  if Result then
  begin
    Result := fs.write(Value[1], Length(Value)) = Length(Value);
  end;
end;

Cteni:

function ReadFromStream(var Value : integer; fs : TFileStream) : boolean;
// read integer
begin
  Result := fs.read(Value, SizeOf(Value)) = SizeOf(Value);
end;

function ReadFromStream(var Value : string; fs : TFileStream) : boolean;
// read string
var
  i : integer;
begin
  Result := ReadFromStream(i, fs);
  if Result then
  begin
    SetLength(Value, i);
    Result := fs.read(Value[1], i) = i;
  end;
end;

Zdravim

Jiri Foldyna


Odpovedá: Miso

20. 8. 2004 11:37

----- Original Message -----
From: "Pavel Hauptman" <phauptman@bilbo.cz>
> rad bych se zeptal, jak spravne zapisovat string pomoci TStream. Pouzivam
> nasledujici kod a do souboru se mi zapisuji uplne nesmyslne stringy.
>

..ak chces zapisat string do suboru cez stream, tak sa inspiruj napr. tymto
:

function TXXX.WriteData(const Data: WideString): Integer;
var f : TFileStream;
    ss : TStringStream;
begin
  result := -1;

  try
    try
      if Append then
      begin
        if FileExists(FullPath) then
          f := TFileStream.Create(FullPath, fmOpenReadWrite or
fmShareDenyWrite)
        else
          f := TFileStream.Create(FullPath, fmCreate or fmShareDenyWrite);
        f.Seek(0, soFromEnd);
      end
      else
        f := TFileStream.Create(FullPath, fmCreate or fmShareDenyWrite);

      ss := TStringStream.Create(Data);
      try
        f.CopyFrom(ss, ss.Size);
      finally
        FreeAndNil(ss);
      end;
    finally
      FreeAndNil(f);
    end;
  except on e:Exception do
    begin
      ShowMessage('Error : '+ e.Message);
      exit;
    end;
  end;

  result := 0;
end;

Miso